package dao

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"gopkg.in/yaml.v3"
	"io/ioutil"
)

// 全局变量
var Client *oss.Client
var Bucket string

// OSS 配置结构体
type ossConf struct {
	AliOssAccessKeyId     string `yaml:"aliOssAccessKeyId"`     // OSS 访问密钥 ID
	AliOssAccessKeySecret string `yaml:"aliOssAccessKeySecret"` // OSS 访问密钥 Secret
	AliOssRegion          string `yaml:"aliOssRegion"`          // OSS 区域
	AliOssInternal        bool   `yaml:"aliOssInternal"`        // 是否使用内网
	AliOssBucket          string `yaml:"aliOssBucket"`          // OSS 存储桶名称
}

// 获取 OSS 配置信息
func (c *ossConf) getConf() *ossConf {
	// 读取 configs/application.yaml 文件
	yamlFile, err := ioutil.ReadFile("configs/application.yaml")
	if err != nil {
		fmt.Println(err.Error())
		return c
	}

	// 定义一个中间结构体来解析嵌套的 fileStorage 层
	type fileStorage struct {
		Oss ossConf `yaml:"oss"`
	}

	type config struct {
		FileStorage fileStorage `yaml:"fileStorage"`
	}

	var cfg config
	// 将读取的内容解析到中间结构体中
	err = yaml.Unmarshal(yamlFile, &cfg)
	if err != nil {
		fmt.Println(err.Error())
		return c
	}

	// 将解析后的配置赋值给当前的 ossConf 结构体
	*c = cfg.FileStorage.Oss
	return c
}

// 初始化 OSS 配置
func InitOSS() error {
	var c ossConf
	// 获取配置信息
	c.getConf()

	// 构建 OSS 客户端
	endpoint := c.getEndpoint()
	var err error
	Client, err = oss.New(endpoint, c.AliOssAccessKeyId, c.AliOssAccessKeySecret)
	if err != nil {
		return err
	}
	Bucket = c.AliOssBucket

	// 验证 OSS 客户端连接
	if err := pingOSS(Client, Bucket); err != nil {
		return err
	}

	// 返回配置信息
	return nil
}

// 获取 OSS 终端节点
func (c *ossConf) getEndpoint() string {
	if c.AliOssInternal {
		return fmt.Sprintf("http://%s-internal.aliyuncs.com", c.AliOssRegion)
	}
	return fmt.Sprintf("http://%s.aliyuncs.com", c.AliOssRegion)
}

// 验证 OSS 客户端连接
func pingOSS(c *oss.Client, bucket string) error {
	// 尝试获取存储桶信息
	info, err := c.GetBucketInfo(bucket)
	if err != nil {
		return fmt.Errorf("OSS 客户端连接失败: %w", err)
	}

	// 打印存储桶信息
	fmt.Printf("存储桶信息: %+v\n", info)
	return nil
}
